import { FopApi, PlaylistApi } from "@/lib/api";
import { getBaseName, inMidiIdContext } from "@/lib/utils";
import type { MidiItem } from "./types";

/**
 * Midi 命名空间，内部均为对 MidiItem 的处理函数
 */
export class Midi {
    /**
     * 从指定的 URL 加载 MidiItem
     * @param url - Midi 的 URL
     * @returns 返回一个 MidiItem 对象
     */
    public static async fromUrl(url: string): Promise<MidiItem | undefined> {
        let ret: MidiItem | undefined = undefined;

        // 检查文件后缀
        const URL = url.toUpperCase();
        if (!URL.endsWith(".MID") && !URL.endsWith(".MIDI")) {
            return undefined;
        }

        await inMidiIdContext(
            url,
            async (id: string) => {
                const duration = await PlaylistApi.duration(id);
                const name = getBaseName(url);

                ret = { url, duration, name };
            },
            async (error) => {
                console.error("从", url, "读取 MidiItem 失败", error);
            },
        );

        return ret;
    }

    /**
     * 从指定的名称加载 MidiItem
     * @param name 要加载的 Midi 的名称
     * @returns 返回一个 MidiItem 对象
     */
    public static async fromName(name: string): Promise<MidiItem | undefined> {
        try {
            return await FopApi.readJson(`midi/${name}`);
        } catch (error) {
            console.error(error);
            return;
        }
    }

    /**
     * 保存 MidiItem
     * @param name 要保存的 Midi 的名称
     * @param value 要保存的 MidiItem 对象（如果为空，则移除对应名称的 MidiItem）
     */
    public static async dump(name: string, value?: MidiItem) {
        try {
            if (value === undefined) {
                await FopApi.removeJson(`midi/${name}`);
            } else {
                await FopApi.writeJson(`midi/${name}`, value);
            }
        } catch (error) {
            console.error(error);
        }
    }
}
